using System;
using System.Collections.Generic;
using System.Text;
using Sinacor.Infra.Service.Data;
using System.Data.Common;
using System.Data;
using Sinacor.Infra.Service.Security.Authorization;
using Sinacor.Infra.Service.Common;

namespace Sinacor.Servico.Bovespa.Corretagem.ResourceAccess
{
    /// <summary>
    /// Acesso a dados de tipos de beneficios de politicas de corretagem
    /// </summary>
    public class TipoBeneficio : BaseResourceAccess
    {
        #region Construtor

        public TipoBeneficio()
            : base(AuthorizationContext.Current.CompanyId)
        {
        }
        
        #endregion

        #region Métodos
        /// <summary>
        /// Consulta lista de tipos de benefícios de políticas de corretagem conforme
        /// filtro
        /// </summary>
        /// <param name="entity"></param>
        public List<BusinessEntity.TipoBeneficio> ConsultarTiposBeneficios(BusinessEntity.Parameter.FiltroTipoBeneficio entity)
        {
            List<BusinessEntity.TipoBeneficio> listaTipoBeneficio = null;
            StringBuilder sql = new StringBuilder();

            using (DbCommand command = this.DataBase.GetSqlStringCommand(" "))
            {
                sql.AppendLine("SELECT");
                sql.AppendLine("    TP_BENEF Codigo,");
                sql.AppendLine("    DS_BENEF Descricao,");
                sql.AppendLine("    IN_TIPO_TRAT Tratamento,");
                sql.AppendLine("    COD_BASE_VERI BaseVerificacao");
                sql.AppendLine("FROM");
                sql.AppendLine("    TBOCORR_TIPO_BENEF");
                sql.AppendLine("WHERE 1 = 1");

                //Filtros Opcionais
                if (entity.Codigo.HasValue)
                {
                    sql.AppendLine("AND TP_BENEF = :Codigo");
                    this.DataBase.AddInParameter(command, "Codigo", DbType.Int32, entity.Codigo);
                }

                if (!string.IsNullOrEmpty(entity.Descricao))
                {
                    sql.AppendLine("AND DS_BENEF = :Descricao");
                    this.DataBase.AddInParameter(command, "Descricao", DbType.String, entity.Descricao);
                }

                if (entity.Tratamento.HasValue)
                {
                    sql.AppendLine("AND IN_TIPO_TRAT = :Tratamento");
                    this.DataBase.AddInParameter(command, "Tratamento", DbType.String, EnumConverter.ToString<BusinessEntity.Enum.TipoTratamentoBeneficio?>(entity.Tratamento));
                }

                if (entity.BaseVerificacao.HasValue)
                {
                    sql.AppendLine("AND COD_BASE_VERI = :BaseVerificacao");
                    this.DataBase.AddInParameter(command, "BaseVerificacao", DbType.String, EnumConverter.ToString<BusinessEntity.Enum.TipoBaseVerificacao?>(entity.BaseVerificacao));
                }

                sql.AppendLine("ORDER BY ");
                sql.AppendLine("DS_BENEF");

                command.CommandText = sql.ToString();

                listaTipoBeneficio = this.FindAll<BusinessEntity.TipoBeneficio>(command, reader => new BusinessEntity.TipoBeneficio

                {
                    Codigo = reader.GetValue<int>("Codigo"),
                    Descricao = (reader["Descricao"] != DBNull.Value ? reader.GetValue<string>("Descricao") : string.Empty),
                    Tratamento = (reader["Tratamento"] != DBNull.Value ? EnumConverter.Parse<BusinessEntity.Enum.TipoTratamentoBeneficio?>(reader.GetValue<string>("Tratamento")) : null),
                    BaseVerificacao = (reader["BaseVerificacao"] != DBNull.Value ? EnumConverter.Parse<BusinessEntity.Enum.TipoBaseVerificacao?>(reader.GetValue<string>("BaseVerificacao")) : null)
                });

            }

            return listaTipoBeneficio;
        }
        #endregion
    }
}